package com.atguigu.realtime.util;

import com.atguigu.realtime.common.Constant;
import com.google.common.base.CaseFormat;
import org.apache.commons.beanutils.BeanUtils;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @Author lizhenchao@atguigu.cn
 * @Date 2021/4/21 9:13
 */
public class MyJdbcUtil {
    public static Connection getJdbcConnection(String url,
                                               String driver) {
        try {
            Class.forName(driver);
            return DriverManager.getConnection(url);
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
    
    /*
        1   zhangsan 20
        2   lisi 30
        
     返回值: 通用  List<Map<String, Object>>  弱类型
     
     返回值: List<User/Person>  强类型
     
     select * from user where id=? and age=?
     */
    public static <T> List<T> queryList(Connection conn,
                                        String sql,
                                        Object[] args,
                                        Class<T> tClass,
                                        boolean isCamel) {
        try (PreparedStatement ps = conn.prepareStatement(sql)) {  // 从jdk 1.7 增加的功能: 可以自动关闭资源
            
            // 给占位符赋值
            for (int i = 0; args != null && i < args.length; i++) {
                ps.setObject(i + 1, args[i].toString());
            }
            ResultSet resultSet = ps.executeQuery();
            // 如何获取每行所有的列
            ResultSetMetaData metaData = resultSet.getMetaData();
            ArrayList<T> result = new ArrayList<>();
            while (resultSet.next()) {
                // 一行封装到一个对象: T类的对象  1.  new T()  2. 使用反射
                T t = tClass.newInstance();  // 使用 T这个类的无参构造器来创建对象  一般要求任何的一个类型, 都应该提供一个无参的构造器
                // 列的索引从1开始
                for (int i = 1; i <= metaData.getColumnCount(); i++) {
                    
                    String columnName = metaData.getColumnLabel(i); // 如果有别名获取的是别名, 没有别名就是列名
                    Object value = resultSet.getObject(i);
                    if (isCamel) { // 把下划线转成驼峰命名法  user_name => useName
                        columnName = CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, columnName);
                    }
                    BeanUtils.setProperty(t, columnName, value);
                }
                result.add(t);
                
            }
            return result;
            
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return null;
    }
    
    public static void main(String[] args) {
        Connection conn = getJdbcConnection(Constant.PHOENIX_URL, Constant.PHOENIX_DRIVER);
        List<User> users = queryList(conn, "select spu_id from dim_sku_info", null, User.class, true);
        System.out.println(users);
        
        System.out.println(CaseFormat.LOWER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, "SPU_ID"));
    }
}




